package com.shujia.wyh.day18;

import java.util.ArrayList;
import java.util.Collection;

/*
        上一个案例中，假设存储完所有的学生后，来了一个学习叫李毅，也想放到对象数组中，直接放进去的话，长度已经是确定的，很明显
        没有空的位置，那怎么办呢？又创建了一个新的数组，长度是原来的+1，然后再挨个存放元素
        这时候李毅提前学完毕业找工作，这时候，数组中的元素又少了一个，但是数组就多了一个空位，这个空的位置也占用堆内存空间
        ，所以为了不占用内存空间，又创建了一个新的数组，长度是原来的-1，然后再挨个存放。
        其实经过讲解，我们发现，无论是增加还是删除，都是非常麻烦的，原则上我们应该在原来的存储容器中直接进行增加或者修改
        想一想，如果有一个东西可以随着存放的内容增加而增加，减少而减少就好了。
        这时候，我们想到之前学过的一个容器符合这个条件，叫StringBuffer。
        但是，StringBuffer存储后在容器里面都是一个一个的字符，现在我们想要存储学生对象，再用StringBuffer去存就不合适了
        上面的两个容器都不合适去存储学生对象，我们就想不到还学过哪些容器可以随着内容的改变而改变
        java替我们考虑到了这一点，根据存储元素的不同，元素的特点不同，以及存储与取出的方式不同
        提供了一个集合继承体系给我们使用，简单的来说，就是今天开始上的内容：集合

        （面试题）集合与数组的不同点：
            1、数组的长度是不可变的，集合是可以改变的
            2、数组可以存放基本数据类型的数据，也可以存放引用数据类型的数据
                集合只能存放引用数据类型的数据，但是一个集合中可以存放不同的数据类型元素
                （注意：尽管我们说了集合可以存放不同的数据类型数据，但是，在实际开发中，一个集合存放的一类数据）

        集合可以根据存放各种各样的数据，每种数据的长度，大小以及自身的特点都是不一样的
        所以，java中集合也不应该是单一的，我们应该针对不同的需要，使用java提供的不同的集合类
        这么的集合，他们的底层数据结构也是不同的，不同没有关系，我们只要知道集合是用来存储元素的，不光可以进行存储，还可以进行
        查找，删除，判断，等等。
        集合继承体系：不同的集合不断地向上提取，这些不同集合应该有着某种共性，我们根据共性向上提取，最终会得到一个集合继承体系。

        Collection：
        public interface Collection<E> extends Iterable<E>
        集合层次结构中的根接口 。
        集合表示一组被称为其元素的对象。
        一些集合允许重复元素，而其他集合不允许。 有些可以是有序和其他无序。
            1、添加功能：
                boolean add(Object e) 确保此集合包含指定的元素（可选操作）。
                boolean addAll(Collection c) 将指定集合中的所有元素添加到此集合（可选操作）。
            2、删除功能：
                boolean remove(Object o) 从该集合中删除指定元素的单个实例（如果存在）（可选操作）。
                boolean removeAll(Collection c) 删除指定集合中包含的所有此集合的元素（可选操作）。
                void clear() 从此集合中删除所有元素（可选操作）。
            3、获取功能：
                Iterator iterator() 返回此集合中的元素的迭代器。
            4、判断功能：
                boolean contains(Object o) 如果此集合包含指定的元素，则返回 true 。
                boolean containsAll(Collection c) 如果此集合包含指定 集合中的所有元素，则返回true。
                boolean isEmpty() 如果此集合不包含元素，则返回 true 。
            5、int size() 返回此集合中的元素数。
            6、求交集
                boolean retainAll(Collection c) 仅保留此集合中包含在指定集合中的元素（可选操作）。
            7、将集合转换成数组
                Object[] toArray() 返回一个包含此集合中所有元素的数组。




 */
public class CollectionDemo1 {
    public static void main(String[] args) {
        //由于Collection是一个接口，我们需要借助一个实现子类来创建对象，这里先用ArrayList举例使用Collection里面的方法
        //接口多态
        Collection c1 = new ArrayList();

        //boolean add(Object e) 确保此集合包含指定的元素（可选操作）。
        System.out.println(c1.add("hello"));
        // 通过调用两次添加相同的元素方法，发现都是true，大致上我们推测出ArrayList集合是允许元素重复的
        System.out.println(c1.add("hello"));
        c1.add(20);
        c1.add(12.34);

        System.out.println(c1); // 重写了toString() 可以看出当前集合中存的元素

        //void clear() 从此集合中删除所有元素（可选操作）。
//        c1.clear();
//        System.out.println("调用完clear之后的集合c1:" + c1);

        System.out.println("====================================================");
        //boolean remove(Object o) 从该集合中删除指定元素的单个实例（如果存在）（可选操作）。
//        boolean b1 = c1.remove("hello");
        boolean b1 = c1.remove("java");
        System.out.println(b1);
        System.out.println(c1);

        System.out.println("=====================================================");
        //boolean contains(Object o) 如果此集合包含指定的元素，则返回 true 。
//        boolean b2 = c1.contains("hello");
        boolean b2 = c1.contains("java");
        System.out.println(b2);
        System.out.println(c1);
        System.out.println("=====================================================");
        //boolean isEmpty() 如果此集合不包含元素，则返回 true 。
//        c1.clear();
        boolean b3 = c1.isEmpty();
        System.out.println(b3);
        System.out.println(c1);
        System.out.println("======================================================");
        //如何获取集合的元素个数呢？
        //int size()返回此集合中的元素数。
        int size = c1.size();
        System.out.println("当前集合中元素的个数为：" + size);
        System.out.println("======================================================");
        /*
                java.lang.Object
                    java.util.AbstractCollection(最终确定在该抽象类中进行方法的重写)
                            public String toString()
                            返回此集合的字符串表示形式。
                            字符串表示由集合的元素的列表按照它们的迭代器返回的顺序包含在方括号（ "[]" ）中。
                            相邻元素由字符", " （逗号和空格）分隔。
                        java.util.AbstractList<E>
                            java.util.ArrayList<E>
         */
        System.out.println(c1); //
    }
}
